// Глобальные переменные
var user = ko.observable();
var all = {
	issues: ko.observableArray([]),
	issueStatuses: ko.observableArray([]),
	issueTypes: ko.observableArray([]),
	issuePriorities: [
		{
			name: 'Без приоритета',
			class: '',
			index: 0,
		},
		{
			name: 'Низкий приоритет',
			class: 'low',
			index: 1,
		},
		{
			name: 'Средний приоритет',
			class: 'medium',
			index: 2,
		},
		{
			name: 'Высокий приоритет',
			class: 'high',
			index: 3,
		}
	],
	chunks: ko.observableArray([]),
	projects: ko.observableArray([]),
	users: ko.observableArray([]),
};
var windowHeight = ko.observable(0);
// Работа с модальными окнами
var modal = {
	params: ko.observable({
		name: 'empty',
		data: {}
	}),
	show: function(){
		$('#modalTmpl').modal({
			keyboard:false,
			show:true
		});
	},
	hide: function(){
		$('#modalTmpl').modal('hide');
	},
	title: ko.observable(''),
	onClose: function(){},
	close: function(){
		modal.onClose();
		modal.hide();
	},
	onSave: function(){},
	save: function(){
		modal.onSave();
	},
	go: function(params){
		modal.params({
			name: params.name || 'empty',
			data: params.data || {}
		});
		modal.title(params.title || '');
		modal.onClose = params.onClose || function(){};
		modal.onSave = params.onSave || function(){};
		modal.show();
	}
};
// Для отображения деталей задачи
var issueDetails = {
	issue: ko.observable(null),
	selectIssue: function(issue){
		issueDetails.issue(issue);
		localStorage['issue.detail.id'] = issue.id();
	},
	style: ko.computed(function(){
		var height = windowHeight() - 42;
		return 'height:' + height + 'px;';
	})
};

// Расширение функционала observableArray
// Поиск по id
ko.observableArray.fn.getById = function(id) {
	for(var i in this()){
		if(this()[i].id() == id)
			return this()[i];
	}
	return null;
};

ko.bindingHandlers.textareaAutoResize = {
    update: function(element) {
        if($(element).is('textarea')){
			if(!$(element).hasClass('autoresized')){
				$(element).autosize({
					animate: false,
					append: ""
				});
				$(element).addClass('autoresized');
			}
			$(element).trigger('change');
		}
    }
};

/**
 * Общие (глобальные) функции
 */
// Заполнение глобальных данных (задач, этапов, проектов и т.д.)
function _fillGlobalData(json){
	// Добавляем пользователей
	var users = [];
	ko.utils.arrayForEach(json.users, function(data){
		users.push(new User(data));
	});
	all.users(users);
	user(all.users.getById(json.id_current_user));
	// Добавляем проекты
	ko.utils.arrayForEach(json.projects, function(data){
		var project = new Project(data);
		all.projects.push(project);
	});
	// Добавляем этапы
	ko.utils.arrayForEach(json.chunks, function(data){
		var chunk = new Chunk(data);
		// Указываем проект
		chunk.project(all.projects.getById(data.id_project));
		// Сохраняем Этапы, которые пришли с сервера
		all.chunks.push(chunk);
	});
	// Сохраняем возможные статусы задач
	ko.utils.arrayForEach(json.issueStatuses, function(data, i){
		all.issueStatuses.push(new IssueStatus({id: i, name: data}));
	});
	// Сохраняем возможные типы задач
	ko.utils.arrayForEach(json.issueTypes, function(data, i){
		all.issueTypes.push(new IssueType({id: i, name: data}));
	});
	// Сохраняем задачи
	var allIssues = [];
	ko.utils.arrayForEach(json.issues, function(data){
		var issue = new Issue(data);
		// Указываем этап
		issue.chunk(all.chunks.getById(data.id_chunk));
		// Указываем статус
		issue.status(all.issueStatuses.getById(data.status));
		// Указываем тип
		issue.type(all.issueTypes.getById(data.type));
		// Указываем приоритет
		issue.priority(all.issuePriorities[data.priority]);
		// Указываем проект
		issue.project(all.projects.getById(data.id_project));
		// Указываем исполнителя
		issue.assignee(all.users.getById(data.id_user_assignee));
		// Сохранение состояния
		issue.takeSnapshot();
		// Добавление в общий список
		allIssues.push(issue);
	});
	all.issues(allIssues);
	issueDetails.issue(all.issues.getById(localStorage['issue.detail.id'] || 0));
};
// Склонение слова от числа
function declensionOfNumber(number, titles) { 
    cases = [2, 0, 1, 1, 1, 2];  
    return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];  
};
function compareIssues(a, b){
	if(a.is_special() == b.is_special()){
		return a.priority().index < b.priority().index;
	}
	return b.is_special() == 1;
}
// Обработка изменения размеров окна
$(function(){
	$(window).resize(function(){
		windowHeight($(window).height());
	}).trigger('resize');
});